home *** CD-ROM | disk | FTP | other *** search
/ Aminet 15 / Aminet 15 - Nov 1996.iso / Aminet / dev / c / EasygadgetsSou.lha / EasyGadgets / ProgressClass.c_backup < prev    next >
Text File  |  1995-04-15  |  5KB  |  230 lines

  1. /*
  2.  *    File:                    GroupFrameClass.c
  3.  *    Description:    GroupFrame BOOPSI class
  4.  *
  5.  *    (C) 1995, Ketil Hunn
  6.  *
  7.  */
  8.  
  9.  
  10. #define    INTUI_V36_NAMES_ONLY
  11.  
  12. #include <exec/types.h>
  13. #include <exec/memory.h>
  14. //#include <dos/dos.h>
  15. //#include <dos/dosextens.h>
  16. #include <intuition/intuition.h>
  17. #include <intuition/gadgetclass.h>
  18. #include <intuition/intuitionbase.h>
  19. #include <intuition/classusr.h>
  20. //#include <intuition/imageclass.h>
  21. #include <intuition/gadgetclass.h>
  22. #include <intuition/cghooks.h>
  23. #include <intuition/icclass.h>
  24. #include <intuition/classes.h>
  25. #include <intuition/sghooks.h>
  26. #include <graphics/gfxbase.h>
  27. #include <graphics/text.h>
  28. #include <graphics/gfxmacros.h>
  29. #include <utility/tagitem.h>
  30. #include <utility/hooks.h>
  31.  
  32. #include <clib/macros.h>
  33. #include <clib/intuition_protos.h>
  34. #include <clib/graphics_protos.h>
  35. #include <clib/dos_protos.h>
  36. #include <clib/exec_protos.h>
  37. #include <clib/gadtools_protos.h>
  38. #include <clib/utility_protos.h>
  39.  
  40. #define USE_BUILTIN_MATH
  41. #include <string.h>
  42.  
  43. #define PRO_Min            (TAG_USER + 9)
  44. #define PRO_Max            (TAG_USER + 10)
  45. #define PRO_Current        (TAG_USER + 11)
  46. #define PRO_ShowPercent (TAG_USER + 12)
  47.  
  48. #define FLAG_SHOWPERCENT 1
  49.  
  50. struct GroupFrameData
  51. {
  52.     UWORD min;
  53.     UWORD max;
  54.     UWORD current;
  55.     UWORD flags;
  56. };
  57.  
  58. ULONG __asm dispatchGroupFrame(register __a0 Class *class, register __a2 Object *o, register __a1 Msg msg);
  59. ULONG RenderGroupFrame(Class *class, struct Gadget *g, struct gpRender *msg, struct GroupFrameData *inst);
  60.  
  61. Class *InitGroupFrameClass(void)
  62. {
  63.   Class *class;
  64.  
  65.     if(class=MakeClass( NULL, "gadgetclass", NULL, sizeof(struct GroupFrameData), 0))
  66.         class->cl_Dispatcher.h_Entry = (ULONG(*)()) dispatchGroupFrame;
  67.     return class;
  68. }
  69.  
  70. BYTE FreeGroupFrameClass(Class *class)
  71. {
  72.     return (BYTE)FreeClass(class);
  73. }
  74.  
  75. ULONG __asm dispatchGroupFrame(register __a0 Class *class, register __a2 Object *o, register __a1 Msg msg)
  76. {
  77.   struct Gadget *g= (struct Gadget *)o;
  78. //  struct RastPort *rp;
  79.   struct GroupFrameData *inst;
  80.   struct TagItem *ti;
  81. //  struct opGet *opget;
  82.   ULONG retval;
  83.   Object *object;
  84.  
  85.  
  86.     switch(msg->MethodID)
  87.     {
  88.         case OM_NEW:
  89.             if(retval=(ULONG)(object=(Object *)DoSuperMethodA(class, o, msg)))
  90.             {
  91.                 ti= ((struct opSet *)msg)->ops_AttrList;
  92.  
  93.                 inst= INST_DATA(class, object);
  94.                 inst->min = GetTagData(PRO_Min,   0, ti);
  95.                 inst->max = GetTagData(PRO_Max, 100, ti);
  96.                 inst->current = GetTagData(PRO_Current, 0, ti);
  97.                 inst->flags = (GetTagData(PRO_ShowPercent, 0, ti) ? FLAG_SHOWPERCENT : 0);
  98.             }
  99.             break;
  100.         case GM_RENDER:
  101.             inst=INST_DATA(class, o);
  102.             retval=RenderGroupFrame(class, g, (struct gpRender *)msg, inst);
  103.             break;
  104. /*        case OM_SET:
  105.             ti= ((struct opSet *)msg)->ops_AttrList;
  106.             if(FindTagItem(GA_Width,  ti) ||
  107.                 FindTagItem(GA_Height, ti) ||
  108.                 FindTagItem(GA_Top,    ti) ||
  109.                 FindTagItem(GA_Left,   ti) ||
  110.                 FindTagItem(PRO_Min, ti) ||
  111.                 FindTagItem(PRO_Max, ti) ||
  112.                 FindTagItem(PRO_Current, ti) ||
  113.                 FindTagItem(PRO_ShowPercent, ti))
  114.                 {
  115.                 WORD x,y,w,h;
  116.                 
  117.                 x= g->LeftEdge;
  118.                 y= g->TopEdge;
  119.                 w= g->Width;
  120.                 h= g->Height;
  121.  
  122.                 retval= DoSuperMethodA(class, o, msg);
  123.  
  124.                 if( rp=ObtainGIRPort( ((struct opSet *)msg)->ops_GInfo) )
  125.                     {
  126.                     UWORD *pens= ((struct opSet *)msg)->ops_GInfo->gi_DrInfo->dri_Pens;
  127.                     struct TagItem *tmp;
  128.                     
  129.                     if( x!=g->LeftEdge || y!=g->TopEdge || w!=g->Width || h!=g->Height )
  130.                         {
  131.                         SetAPen(rp, pens[BACKGROUNDPEN]);
  132.                         SetDrMd(rp, JAM1);
  133.                         RectFill(rp, x, y, x+w, y+h);
  134.                         }
  135.  
  136.                     inst= INST_DATA(class, o);
  137.  
  138.                     inst->min = GetTagData(PRO_Min, (LONG)inst->min, ti);
  139.                     inst->max = GetTagData(PRO_Max, (LONG)inst->max, ti);
  140.                     inst->current = GetTagData(PRO_Current, (LONG)inst->current, ti);
  141.                     if( tmp=FindTagItem(PRO_ShowPercent, ti) )
  142.                         {
  143.                         inst->flags = ( tmp->ti_Data ? FLAG_SHOWPERCENT : 0);
  144.                         }
  145.  
  146.                     DoMethod(o, GM_RENDER, ((struct opSet *)msg)->ops_GInfo, rp, GREDRAW_REDRAW);
  147.                     ReleaseGIRPort(rp);
  148.                     }
  149.                 }
  150.             else
  151.                 {
  152.                 retval= DoSuperMethodA(class, o, msg);
  153.                 }
  154.             break;
  155.         case OM_GET:
  156.             opget= (struct opGet *)msg;
  157.             inst= INST_DATA(class, o);
  158.             retval= TRUE;
  159.             switch( opget->opg_AttrID )
  160.                 {
  161.                 case PRO_Current:
  162.                     *(opget->opg_Storage)= (ULONG)inst->current;
  163.                     break;
  164.                 case PRO_Min:
  165.                     *(opget->opg_Storage)= (ULONG)inst->min;
  166.                     break;
  167.                 case PRO_Max:
  168.                     *(opget->opg_Storage)= (ULONG)inst->max;
  169.                     break;
  170.                 case PRO_ShowPercent:
  171.                     *(opget->opg_Storage)= (ULONG)( inst->flags & FLAG_SHOWPERCENT );
  172.                     break;
  173.                 default:
  174.                     retval= DoSuperMethodA(class, o, msg);
  175.                 }
  176.             break;
  177. */
  178.         case GM_HITTEST:
  179.         case GM_GOACTIVE:
  180.         case GM_HANDLEINPUT:
  181.         case GM_GOINACTIVE:
  182.         default:
  183.             retval= DoSuperMethodA(class, o ,msg);
  184.             break;
  185.         }
  186.     return( retval );
  187. }
  188.  
  189. ULONG RenderGroupFrame(Class *class, struct Gadget *g, struct gpRender *msg, struct GroupFrameData *inst)
  190. {
  191.   struct RastPort *rp;
  192.   ULONG retval=TRUE;
  193.   UWORD *pens= msg->gpr_GInfo->gi_DrInfo->dri_Pens;
  194.  
  195.     if( msg->MethodID == GM_RENDER )
  196.         rp= msg->gpr_RPort;
  197.     else
  198.         rp= ObtainGIRPort(msg->gpr_GInfo);
  199.  
  200.     if(rp)
  201.     {
  202.         UBYTE shine, shadow;
  203.         UWORD x, y;
  204.         UBYTE oldAPen, oldDrMd;
  205.  
  206.         oldAPen= rp->FgPen;
  207.         oldDrMd= rp->DrawMode;
  208.  
  209.         shine = pens[SHADOWPEN];
  210.         shadow= pens[SHINEPEN];
  211.  
  212.         SetAPen(rp, shadow);
  213.         RectFill(rp,    x=g->LeftEdge,
  214.                                     y=g->TopEdge,
  215.                                     x+g->Width,
  216.                                     y+g->Height);
  217.         SetAPen(rp, oldAPen);
  218.         SetDrMd(rp, oldDrMd);
  219.  
  220.         if( msg->MethodID != GM_RENDER )
  221.             {
  222.             ReleaseGIRPort(rp);
  223.             }
  224.     }
  225.     else
  226.         retval= FALSE;
  227.  
  228.     return( retval );
  229. }
  230.